package com.hongchen.qrcode;

import com.jfinal.kit.PathKit;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

/**
 * Created by 3426624897@qq.com on 2018/3/29 0029.
 * 自定义生成图片
 */
public class CustomImage {

    /**
     * @param srcImgPath 源图片路径
     * @param tarImgPath 保存的图片路径
     * @param waterMarkContent 水印内容
     * @param markContentColor 水印颜色
     * @param font 水印字体
     */
    public void addWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent, String id, String time,
                             String ground, String end_time, String str, String recommend, String details, String build1,
                             String buid1_1, String build2, String build2_1, String tuijian, Color markContentColor, Font font) {

        try {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            g.setColor(markContentColor); //根据图片的背景设置水印颜色
            g.setFont(font);              //设置字体
            //设置水印的坐标
            int x = 138;
            int y = 520;
            g.drawString(waterMarkContent, x, y);  //画出水印 - 名字
            g.drawString(id, 481, 521);  //画出水印 - 电话
            g.drawString(time, 191, 576);  //画出水印 - 家庭成员
            g.drawString(ground, 505, 574);  //画出水印 - 工作地

            //需求
            imagePages(g,str,142,630,20);

            //推荐区域
            g.drawString(end_time, 202, 1055);  //画出水印 - 结束日期
            imagePages(g,recommend,64,1117,25);
            //区域详情
            imagePages(g,details,64,1359,25);

            //首选楼盘1
            g.drawString(build1, 127, 1725);  //画出水印 - 结束日期
            //首选楼盘1详情
            imagePages(g,buid1_1,64,1779,25);
            //首选楼盘2
            g.drawString(build2, 127, 1990);  //画出水印 - 结束日期
            //首选楼盘2详情
            imagePages(g,build2_1,64,2044,25);

            //推荐
            g.drawString(tuijian, 245, 2238);  //画出水印 - 结束日期
            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            System.out.println("添加水印完成");
            outImgStream.flush();
            outImgStream.close();

        } catch (Exception e) {
            System.out.println("添加水印失败！");
        }
    }

    public void addWaterDetail(String srcImgPath, String tarImgPath, String name, String tel, String memberNum,String company, String demand, String areaBold, String area, String areaDetails,
                                String build1,String buid1Detail, String build2, String build2Detail, String build3, String build3Detail, String model1, String model1Detail,String model2, String model2Detail,
                                String otherBuild1,String otherBuild1Detail,String otherBuild1Good,String otherBuild1Bad, String otherBuild2,String otherBuild2Detail,String otherBuild2Good,String otherBuild2Bad,String prompt,Color markContentColor, Font font) {

        try {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
            int srcImgHeight = srcImg.getHeight(null);//获取图片的高
            // 加水印
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            g.setColor(markContentColor); //根据图片的背景设置水印颜色
            g.setFont(font);              //设置字体

            g.drawString(name, 166, 540);  //名字
            g.drawString(tel, 451, 540);  //电话
            g.drawString(memberNum, 168, 593);  //家庭成员个数
            g.drawString(company, 505, 594);  //工作地
            imagePages(g,demand,162,650,20);//需求
            g.drawString(areaBold, 178, 1210);  //推荐区域加粗
            imagePages(g,area,51,1250,25);//推荐区域
            imagePages(g,areaDetails,60,1560,25);//区域详情

            g.drawString(build1, 95, 2251);  //首选楼盘1
            imagePages(g,buid1Detail,48,2300,25);//首选楼盘1详情
            g.drawString(build2, 95, 2574);  //首选楼盘2
            imagePages(g,build2Detail,48,2630,25);//首选楼盘2详情
            g.drawString(build3, 95, 2930);  //首选楼盘3
            imagePages(g,build3Detail,48,2970,25);//首选楼盘3详情

            g.drawString(model1, 96, 3339);  //推荐户型1
            imagePages(g,model1Detail,48,3386,25);//推荐户型1详情
            g.drawString(model2, 96, 3829);  //推荐户型2
            imagePages(g,model2Detail,48,3875,25);//推荐户型2详情

            g.drawString(otherBuild1, 102, 4256);  //推荐其他楼盘1
            imagePages(g,otherBuild1Detail,48,4305,25);//推荐其他楼盘1详情
            imagePages(g,otherBuild1Good,48,4554,25);//推荐其他楼盘1优势
            imagePages(g,otherBuild1Bad,48,4739,25);//推荐其他楼盘1劣势

            g.drawString(otherBuild2, 102, 4823);  //推荐其他楼盘2
            imagePages(g,otherBuild2Detail,48,4875,25);//推荐其他楼盘2详情
            imagePages(g,otherBuild2Good,48,5141,25);//推荐其他楼盘2优势
            imagePages(g,otherBuild2Bad,48,5371,25);//推荐其他楼盘2劣势
            g.drawString(prompt, 93, 5520);  //总编提示
            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            System.out.println("添加水印完成");
            outImgStream.flush();
            outImgStream.close();

        } catch (Exception e) {
            System.out.println("添加水印失败！");
        }
    }


    //分行输出图片
    public void imagePages(Graphics2D g,String str,int sx,int sy,int st){
        int sq = 0;
        int space = 30;
        int i;
        if(str != null){
            i = str.length();
        }else {
            i = 0;
        }
        if( i < st){
            g.drawString(str.substring(0,i),sx,sy);
        }else {
            for(int l = 0;l <= i/st;l++){
                g.drawString(str.substring(sq,st),sx,sy);
                sq+=st;
                st+=st;
                sy+=space;//空行
            }
        }

    }

    public int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

    public static void main(String[] args) {
        Font font = new Font("微软雅黑", Font.PLAIN, 25); //水印字体
        String srcImgPath= PathKit.getWebRootPath()+"\\src\\main\\webapp\\msg\\report2.jpg"; //源图
        String tarImgPath= PathKit.getWebRootPath()+"\\src\\main\\webapp\\msg\\report2_alter.jpg"; //生成图
        String name="XXX";  //水印内容
        String tel="13073746893";
        String memberNum="8人";
        String company="公司地址";
        String demand="你好，专家！请问在郑州，置换改善楼盘怎么买？有哪些可以推荐？我的需求是：房子必须是四房的户型，而且是双卫的，厨房要大，餐厅要大，毕竟6扣子，买房子本来是一件很开心的事情，而且也是一键让人自豪的事情。" +
                "不过如果有些步骤不注意好，那么买房中途会出现各种恼火和崩溃的事情。 小编就深受折磨的说。 我们不光是要关注房子质量、口碑等问题。 如果是按揭买房。贷款这个步骤也是非常要注意的。";
        String areaB = "老东区和惠济北区";
        String area="老东区和惠济北区 简介老东区和惠济北区，简介老东区和惠济北区简介简介老东区和惠济北区，简介老东区和惠济北区简介简介老东区和惠济北区，简介老东区和惠济北区简介";
        String areadetails="老东区和惠济北区 区域详情,区域详情区域详情,区域详情,区域详情,区域详情区域详情区域详情区域详情区域详情区域详情区域详情区域详情区域详情";
        String build1="金科城";
        String buid1D="金科城推荐区域加粗 推荐区域加粗推荐区域加粗推荐区域加粗推荐区域加粗推荐区域加粗推荐区域加粗推荐区域加粗推荐区域加粗推荐区域加粗";
        String build2="桂碧园西湖";
        String build2D="有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。每个月在银行卡里面存一点";
        String build3="build3";
        String build3D="build3D 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String model1="model1";
        String model1D="model1D 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String model2="model2";
        String model2D="model2D 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String other1="other1";
        String other1D="other1D 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String other1Dgood="other1Dgood 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String other1Dbad="other1Dbad 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String other2="other2";
        String other2D="other2D 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String other2Dgood="other2Dgood 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String other2Dbad="other2Dbad 有的人可能工资不是很高，买房也大部分都是家里出的首付。自己的银行流水账单可能不是很漂亮。在你买房之前。最好是做一个漂亮点的流水账。 每个月在银行卡里面存一点";
        String prompt="三者之中，重点推荐维思同频！";

        Color color=new Color(0,0,0,255);                               //水印图片色彩以及透明度
        new CustomImage().addWaterDetail(srcImgPath, tarImgPath, name,tel,memberNum,company,demand,areaB,area,areadetails,build1,buid1D,build2,build2D,build3,build3D,model1,model1D,
                model2,model2D,other1,other1D,other1Dgood,other1Dbad,other2,other2D,other2Dgood,other2Dbad,prompt,color,font);

    }

    /*public static void main(String[] args) {
        Font font = new Font("微软雅黑", Font.PLAIN, 25); //水印字体
        String srcImgPath= PathKit.getWebRootPath()+"\\src\\main\\webapp\\msg\\report.jpg"; //源图
        String tarImgPath= PathKit.getWebRootPath()+"\\src\\main\\webapp\\msg\\report_alter.jpg"; //生成图
        String waterMarkContent="阿娇?";  //水印内容
        String id="13073746893";
        String time="8人";
        String ground="你猜呀";
        String end_time="1";
        String str="嘿嘿嘿嘿嘿嘿嘿嘿-嘿嘿嘿嘿嘿嘿，。1@嘿嘿-嘿嘿嘿嘿-蛤！嘿嘿嘿嘿嘿嘿嘿啥答案所 爱疯天发飞 啊啊阿打算爱神的箭阿打算爱莎爱莎";
        String recommend = "发个首付首付防辐射服发送色粉色粉色二手粉色色二手色粉色粉肺栓塞色";
        String details="区域详情,区域详情区域详情,区域详情,区域详情,区域详情区域详情区域详情区域详情区域详情区域详情区域详情区域详情区域详情";
        String build1="金科城";
        String buid1_1="金科城是是是ad飞萨达洒水大撒多风服务额外付费的丰富涩涩的的非凡哥个人不给你贵公司可接受的了我粉红色饿哦if";
        String build2="桂碧园西湖";
        String build2_1="桂碧园西湖撒大声地困窘问问为非人为飞为我我卡里为为礼物为了我完了完了为了未来礼物了为了了为了了为了我凉了为了完了完了";
        String tuijian="我们更推荐：金科城";

        Color color=new Color(0,0,0,255);                               //水印图片色彩以及透明度
        System.out.println(end_time.length());
        new CustomImage().addWaterMark(srcImgPath, tarImgPath, waterMarkContent,id,time,ground,end_time,str,recommend,details,build1,buid1_1,build2,build2_1,tuijian,color,font);

    }*/

}
